
/**
 * 大部分时候都把类的构造器定义成public访问权限，允许任何类自由创建该类的对象。
 * 但在某些时候，允许其他类自由创建该类的对象没有任何意义，还可能造成系统性能下降（因为频繁地创建对象、回收对象带来的系统开销问题）。
 * <p>
 * 如果一个类始终只能创建一个实例，则这个类被称为单例类。
 * <p>
 * 为了避免其他类自由创建该类的实例，应该把该类的构造器使用private修饰，从而把该类的所有构造器隐藏起来。
 * <p>
 * 一旦把该类的构造器隐藏起来，就需要提供一个public方法作为该类的访问点，用于创建该类的对象，且该方法必须使用static修饰
 * <p>
 * 除此之外，该类还必须缓存已经创建的对象，否则该类无法知道是否曾经创建过对象，也就无法保证只创建一个对象。
 * 为此该类需要使用一个成员变量来保存曾经创建的对象，因为该成员变量需要被上面的静态方法访问，故该成员变量必须使用static修饰。
 */
class Singleton {
    // 使用一个类变量来缓存曾经创建的示例
    private static Singleton instance;

    // 对构造器使用private修饰，隐藏该构造器
    private Singleton() {
        System.out.println("Singleton构造器被调用了");
    }

    // 提供一个静态方法，用于返回Singleton实例
    // 该方法可以加入自定义控制，保证只产生一个Singleton对象
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

public class SingletonTest {
    public static void singletonTest() {
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();
        System.out.println(s1 == s2);
    }

    public static void main(String[] args) {
        singletonTest();
    }
}
